package prirprojekt;

import java.util.Arrays;

public class Roj {

    int iloscRobotnic, iloscObserwatorow, iloscSkautow, liczbaProcesorow, liczbaIteracji;
    PermutacjaZadan[] permutacjeZadan;

    public Roj(int liczbaProcesorow, int liczbaIteracji, int iloscRobotnic, PermutacjaZadan zadania) {
        this.iloscRobotnic = iloscRobotnic;
        this.permutacjeZadan = new PermutacjaZadan[iloscRobotnic];
        for (int i = 0; i < iloscRobotnic; i++) {
            permutacjeZadan[i] = zadania.losuj();
        }
        this.liczbaProcesorow = liczbaProcesorow;
        this.liczbaIteracji = liczbaIteracji;
        this.iloscObserwatorow = 2 * iloscRobotnic;
        this.iloscSkautow = (int) 0.2 * iloscRobotnic;
    }
    
    public void iteruj() throws InterruptedException{
        while(liczbaIteracji > 0){
            liczbaIteracji -= 1;
            wyslijRobotnice();
            wyslijObserwatorow();
            wyslijSkautow();
        }
    }

    void wyslijRobotnice() throws InterruptedException {
        Pszczola[] poslane = new Pszczola[iloscRobotnic];
        for (int i = 0; i < iloscRobotnic; i++) {
            Pszczola p = new Pszczola(permutacjeZadan[i]);
            poslane[i] = p;
            p.start();
        }
        for (int i = 0; i < iloscRobotnic; i++) {
            poslane[i].join();
        }
    }

    void wyslijObserwatorow() throws InterruptedException {
        Obserwator[] poslani = new Obserwator[iloscRobotnic];
        for (int i = 0; i < iloscObserwatorow; i++) {
            int i1, i2;
            i1 = (int) (Math.random() * permutacjeZadan.length);
            i2 = (int) (Math.random() * permutacjeZadan.length);
            while (i1 == i2) {
                i2 = (int) (Math.random() * permutacjeZadan.length);
            }
            if (permutacjeZadan[i1].jakosc() > permutacjeZadan[i2].jakosc()) {
                Obserwator p = new Obserwator(permutacjeZadan[i1], poslani[i1]);
                poslani[i1] = p;
                p.start();
            } else {
                Obserwator p = new Obserwator(permutacjeZadan[i2], poslani[i2]);
                poslani[i2] = p;
                p.start();
            }
        }
        for (int i = 0; i < iloscRobotnic; i++) {
            if(poslani[i] != null){
                poslani[i].join();
            }
        }
    }

    void wyslijSkautow() throws InterruptedException {
        Arrays.sort(permutacjeZadan);
        Skaut[] poslani = new Skaut[iloscSkautow];
        for(int i = 0; i < iloscSkautow; i++){
            Skaut s = new Skaut(permutacjeZadan[i]);
            poslani[i] = s;
            s.start();
        }
        for(int i = 0; i < iloscSkautow; i++){
            poslani[i].join();
        }
        Arrays.sort(permutacjeZadan);
    }
}
